AD7606调试过程与源码

您所在的位置:网站首页 imx6ull can驱动源码详解 AD7606调试过程与源码

AD7606调试过程与源码

2024-06-17 17:33| 来源: 网络整理| 查看: 265

公司有一个项目用到了AD7606,控制器用的STM32,使用的模式是并行16位模式,程序刷好之后发现读取的AD数据乱码,结果发现是因为AD7606的接地不对,当然这个问题是我师傅找出来的,查找的过程如下: 用示波器看了BUSY线,转换线等各种线的波形,目的是确定芯片是否正常工作。 师傅又测量了V1通道两端的波形,在没有给输入的情况下发现存在波形。 后面师傅又去看了下手册,发现V1通道需要接AGND,基准电压接地脚同样要接AGND,但是在电路中,V1与V8通道与基准电压接地脚的地线都分开了,通道接到了24V地,基准接到了3V3,所以导致读取的数据乱码。 原因就是地线分开了。

#include "delay.h" //.C文件 #include "ad7606.h" #include "dac.h" void AD7606_reset(void); void AD7606_startConv(void); u16 AD7606_readFirstData(void); /************************************************ 函数名称 : AD7606_config 功 能 : 初始化AD7606引脚 参 数 : 无 返 回 值 : 无 *************************************************/ void AD7606_config(void) { GPIO_InitTypeDef GPIO_initStructure; RCC_APB2PeriphClockCmd(AD7606_PORT_RCC,ENABLE); //开启AD7606引脚时钟 GPIO_initStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //16位数据端输入 GPIO_initStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_initStructure.GPIO_Pin = AD7606_DATA_PORT; GPIO_Init(AD7606_DATA_GPIOx,&GPIO_initStructure); GPIO_initStructure.GPIO_Pin = AD7606_FRST_PORT; //FRST引脚配置,浮空输入 GPIO_Init(AD7606_FRST_GPIOx,&GPIO_initStructure); GPIO_initStructure.GPIO_Pin = AD7606_BUSY_PORT; //BUSY引脚,浮空输入 GPIO_Init(AD7606_BUSY_GPIOx,&GPIO_initStructure); GPIO_initStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出方式 GPIO_initStructure.GPIO_Pin = AD7606_RANGE_PORT; //RANGE配置 GPIO_Init(AD7606_RANGE_GPIOx,&GPIO_initStructure); GPIO_initStructure.GPIO_Pin = AD7606_OS0_PORT; //过采样引脚配置 GPIO_Init(AD7606_OS0_GPIOx,&GPIO_initStructure); GPIO_initStructure.GPIO_Pin = AD7606_OS1_PORT; GPIO_Init(AD7606_OS1_GPIOx,&GPIO_initStructure); GPIO_initStructure.GPIO_Pin = AD7606_OS2_PORT; GPIO_Init(AD7606_OS2_GPIOx,&GPIO_initStructure); GPIO_initStructure.GPIO_Pin = AD7606_CONAB_PORT; //转换配置 GPIO_Init(AD7606_CONAB_GPIOx,&GPIO_initStructure); GPIO_initStructure.GPIO_Pin = AD7606_RST_PORT; //复位 GPIO_Init(AD7606_RST_GPIOx,&GPIO_initStructure); GPIO_initStructure.GPIO_Pin = AD7606_RD_PORT; //RD GPIO_Init(AD7606_RD_GPIOx,&GPIO_initStructure); GPIO_initStructure.GPIO_Pin = AD7606_CS_PORT; //CS GPIO_Init(AD7606_CS_GPIOx,&GPIO_initStructure); AD7606_RANGE_10V(); AD7606_CS_HIGH(); AD7606_RST_LOW(); AD7606_RD_HIGH(); AD7606_CONAB_HIGH(); AD7606_SampleRate(AD7606_SAMPLE_200K); } /** @brief 设置AD7606采样频率 @param -sampleRate- AD7606_SAMPLE_200K: 采样频率200kHz \n AD7606_SAMPLE_100K: 采样频率100kHz \n AD7606_SAMPLE_50K: 采样频率50kHz \n AD7606_SAMPLE_25K: 采样频率25kHz \n AD7606_SAMPLE_12K5: 采样频率12.5kHz \n AD7606_SAMPLE_6K25: 采样频率6.25kHz \n AD7606_SAMPLE_3K125:采样频率3.125kHz \n */ void AD7606_SampleRate(u8 sampleRate) { switch(sampleRate) { case AD7606_SAMPLE_200K: //采样频率200kHz AD7606_OS0_LOW(); AD7606_OS1_LOW(); AD7606_OS2_LOW(); break; case AD7606_SAMPLE_100K: //采样频率100kHz AD7606_OS0_HIGH(); AD7606_OS1_LOW(); AD7606_OS2_LOW(); break; case AD7606_SAMPLE_50K: //采样频率50kHz AD7606_OS0_LOW(); AD7606_OS1_HIGH(); AD7606_OS2_LOW(); break; case AD7606_SAMPLE_25K: //采样频率25kHz AD7606_OS0_HIGH(); AD7606_OS1_HIGH(); AD7606_OS2_LOW(); break; case AD7606_SAMPLE_12K5: //采样频率12.5kHz AD7606_OS0_LOW(); AD7606_OS1_LOW(); AD7606_OS2_HIGH(); break; case AD7606_SAMPLE_6K25: //采样频率6.25kHz AD7606_OS0_HIGH(); AD7606_OS1_LOW(); AD7606_OS2_HIGH(); break; case AD7606_SAMPLE_3K125: //采样频率3.125kHz AD7606_OS0_LOW(); AD7606_OS1_HIGH(); AD7606_OS2_HIGH(); break; default: AD7606_OS0_LOW(); //采样频率200kHz AD7606_OS1_LOW(); AD7606_OS2_LOW(); break; } } /** @brief AD7606读取转换值 @param -data- 8个16位元素的数组,用来存储8通道转换值。参数为数组首地址。 @return 0: 转换成功 \n 其他值: 转换失败 @warning data数组的长度必须大于等于8 */ u8 AD7606_readConversionValue(u16 *data) { u8 i; u16 counter; static uint8_t a=1; GPIO_InitTypeDef GPIO_initStructure; GPIO_initStructure.GPIO_Mode = GPIO_Mode_IPU; //AD7606数据输出端引脚配置,上拉输入模式 GPIO_initStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_initStructure.GPIO_Pin = AD7606_DATA_PORT; GPIO_Init(AD7606_DATA_GPIOx,&GPIO_initStructure); AD7606_CS_RD_HIGH(); //CS\RD引脚配置为高电平 if(a==1) { a=0; AD7606_reset(); //复位信号 } i = AD7606_BUSY_STATE(); //判断BUSY AD7606_startConv(); //转换信号 counter = 0; i = AD7606_BUSY_STATE(); //判断BUSY while(i) { i = AD7606_BUSY_STATE(); //判断BUSY //delay_us(0); counter ++; if(counter > 50000) //判断超时 return 1; } AD7606_CS_LOW(); //CS拉低 i = AD7606_FRST_STATE(); //判断FRST AD7606_RD_HIGH(); //RD下降沿,V1通道开始转换 delay_us(1); AD7606_RD_LOW(); delay_us(2); counter = 0; i = AD7606_FRST_STATE(); //判断FRST while(!i) { //delay_us(1); i = AD7606_FRST_STATE(); //判断FRST counter ++; if(counter > 50000) //判断超时 return 2; } data[0] = AD7606_READ_DATA(); //V1通道数据传入data中 AD7606_RD_HIGH(); //---------AD7606_RD_HIGH for(i=1;i 8); // data[i] = GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_15) | // GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_14)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3